package practisedemo;

/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 * 使用 Runnable 实现线程有返回值时的情况
 * 计算 1 —— 1000 的和，仅供演示
 */
@SuppressWarnings({"all"})
public class Demo2 {

    // 1. 创建一个类 Result , 包含一个 sum 表示最终结果, lock 表示线程同步使用的锁对象
    static class Result {
        public int sum = 0;
        public Object lock = new Object();
    }

    public static void main(String[] args) {
        // 2. main 方法中先创建 Result 实例, 然后创建一个线程 t. 在线程内部计算 1 + 2 + 3 + ... + 1000
        Result result = new Result();
        Thread t = new Thread(()->{
            int sum = 0;
            for (int i = 1; i <= 1000; i++) {
                sum += i;
            }
            // 计算完毕存储结果
            synchronized(result.lock){
                result.sum = sum;
                // 当线程 t 计算完毕后, 通过 notify 唤醒主线程, 主线程再打印结果
                result.lock.notify();
            }
        });
        t.start();

        // 3. 主线程同时使用 wait 等待线程 t 计算结束. (注意, 如果执行到 wait 之前, 线程 t 已经计算完了, 就不必等待了)
        synchronized(result.lock){
            while (result.sum == 0){
                try {
                    result.lock.wait(); // 等待唤醒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("1-1000的和为: " + result.sum);
        }
    }
}
